#include <iostream>
#include <vector>

using namespace std;
// 1248.统计[优美子数组]
//给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字，我们就认为这个子数组是「优美子数组」。
//
//请返回这个数组中 「优美子数组」 的数目。
class Solution {
public:
    int numberOfSubarrays(vector<int>& nums, int k) {
        // 原问题：子段的奇数数量
        // 新问题：奇数看做1，偶数看作0（每个数mod 2），统计子段和是k的子段数量。
        // sum(l,r) == k
        // s[r] - s[l-1] == k(l <= r)
        //两数之差：一个是s[r]，一个是s[l-1]
        int n = nums.size();
        vector<int> s(n+1); // s[0..n]
        s[0] = 0;
        for(int i = 1; i <= n; i++)
            s[i] = s[i-1] + nums[i-1] % 2;  // s[i]是从1开始
        vector<int> count(n+1); // 0~n
        count[s[0]]++;
        int ans = 0;
        for(int i = 1; i <= n; i++) {
            if(s[i]-k >= 0)
              ans += count[s[i] - k]; // s[i] - s[j] == k
            count[s[i]]++;
        }
        return ans;

    }
};

int main() {
    vector<int> nums1 = {1, 1, 2, 1, 1};
    cout << Solution().numberOfSubarrays(nums1, 3) << endl;
    // 2
    return 0;
}
